package 算法;

import org.springframework.util.StringUtils;

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;

/**
 * 日期处理工具类
 */
public class DateUtils {

  /**
   * dateNow:获取当前时间的字符串格式，根据传入的格式化来展示. <br/>
   *
   * @param format 日期格式化
   * @return
   */
  public static String dateNow(String format) {
    SimpleDateFormat fmt = new SimpleDateFormat(format);
    Calendar c = new GregorianCalendar();
    return fmt.format(c.getTime());
  }

  /**
   * formatDate:格式化日期，返回指定的格式 <br/>
   *
   * @param time
   * @param format
   * @return
   */
  public static String formatDate(Date time, String format) {
    SimpleDateFormat fmt = new SimpleDateFormat(format);
    return fmt.format(time.getTime());
  }

  /**
   * parseDate:将字符串转换成日期，使用：yyyy-MM-dd HH:mm:ss 来格式化
   *
   * @param date
   * @return
   */
  public static Date parseDate(String date) {
    return parseDate(date, "yyyy-MM-dd HH:mm:ss");
  }

  /**
   * parseDate:将字符串转换成日期，使用指定格式化来格式化
   *
   * @param date
   * @param pattern
   * @return
   */
  public static Date parseDate(String date, String pattern) {

    if (pattern == null) {
      pattern = "yyyy-MM-dd HH:mm:ss";
    }

    SimpleDateFormat fmt = new SimpleDateFormat(pattern);

    try {

      return fmt.parse(date);
    } catch (Exception ex) {
      ex.printStackTrace();
    }
    return null;

  }

  /**
   * 获取当前时间戳(精确到秒)
   *
   * @return
   */
  public static int getNowAt() {
    return (int) ( System.currentTimeMillis() / 1000 );
  }

  /**
   * Integer类型时间转指定格式String类型时间
   *
   * @param date   Integer类型
   * @param format String类型
   * @return String
   */
  public static String itoStr(Integer date, String format) {

    Long time = date.longValue() * 1000;
    SimpleDateFormat simpleFormatter = new SimpleDateFormat(format);

    return simpleFormatter.format(time);
  }

  /**
   * Integer类型时间转 "yyyy-MM-dd HH:mm:ss" 格式String类型时间
   *
   * @param date Integer类型
   * @return String
   */
  public static String itoStr(Integer date, Integer type) {
    if (date == null) {
      return "未知";
    }
      switch (type) {
        case 1:
          return itoStr(date, "yyyy-MM-dd HH:mm:ss");
        case 2:
          return itoStr(date, "yyyy年MM月dd日 HH:mm:ss");
        case 3:
          return itoStr(date, "yyyy年MM月dd日 HH:mm");
        case 4:
          return itoStr(date, "yyyy年MM月dd日");
        case 5:
          return itoStr(date, "yyyy-MM-dd");
        case 6:
          return itoStr(date, "MM月dd日");
        case 7:
          return itoStr(date, "HH:mm:ss");
        case 8:
          return itoStr(date, "HH:mm");
        case 9:
          return itoStr(date, "yyyy-MM-dd HH:mm");
        case 10:
          return itoStr(date, "yyyy/MM/dd");
        default:
          return itoStr(date, "yyyy-MM-dd HH:mm:ss");
      }
  }

  /**
   * calcExpDays:计算某个日期与当前日期相差的天数，如果计算的日期大于现在时间，将返回负数；否则返回正数 <br/>
   *
   * @param userCreateTime
   * @return
   */
  public static int calcExpDays(Date userCreateTime) {

    Calendar start = Calendar.getInstance();
    start.setTime(userCreateTime);

    Calendar now = Calendar.getInstance();
    now.setTime(new Date());

    long l = now.getTimeInMillis() - start.getTimeInMillis();
    int days = new Long(l / ( 1000 * 60 * 60 * 24 )).intValue();
    return days;
  }

  /**
   * 计算两个Integer时间之间差了多少天
   *
   * @param bigDate   大一点的时间 晚一点的时间
   * @param smallDate 小一点的时间 早一点的时间
   * @return int
   */
  public static int calcExpDays(Integer bigDate, Integer smallDate) {
    int day = ( bigDate - smallDate ) / ( 60 * 60 * 24 );

    return day;
  }

  /**
   * 计算两个Integer时间之间差了多少分钟
   *
   * @param bigDate   大一点的时间 晚一点的时间
   * @param smallDate 小一点的时间 早一点的时间
   * @return int
   */
  public static int calcMinute(Integer bigDate, Integer smallDate) {

    int minute = ( bigDate - smallDate ) / 60;

    return minute;
  }

  /**
   * 计算两个Integer时间之间差了多少秒
   *
   * @param bigDate   大一点的时间 晚一点的时间
   * @param smallDate 小一点的时间 早一点的时间
   * @return int
   */
  public static int calcSecond(Integer bigDate, Integer smallDate) {

    int second = bigDate - smallDate;

    return second;
  }

  /**
   * 计算两个Integer时间之间差了分:秒
   *
   * @param bigDate   大一点的时间 晚一点的时间
   * @param smallDate 小一点的时间 早一点的时间
   * @return String
   */
  public static String calcTime(Integer bigDate, Integer smallDate) {

    int minute = ( bigDate - smallDate ) / 60;
    int second = ( bigDate - smallDate ) - minute * 60;

    return minute + ":" + second;
  }

  /**
   * 根据生日计算当前年龄
   *
   * @param birthday 生日日期
   * @return 年龄
   */
  public static int getAgeByBirth(Date birthday) {
    int age = 0;
    try {
      Calendar now = Calendar.getInstance();

      Calendar birth = Calendar.getInstance();
      birth.setTime(birthday);

      if (birth.after(now)) {
        age = 0;
      } else {
        age = now.get(Calendar.YEAR) - birth.get(Calendar.YEAR);
        if (now.get(Calendar.DAY_OF_YEAR) > birth.get(Calendar.DAY_OF_YEAR)) {
          age += 1;
        }
      }
      return age;
    } catch (Exception e) {
      return 0;
    }
  }

  /**
   * 时间转时间戳
   *
   * @param date
   * @return
   */
  public static int dateToAt(Date date) {
    return (int) ( date.getTime() / 1000 );
  }


  public static int _stoInt(String str, int num) {
    if (StringUtils.isEmpty(str)) {
      return 0;
    }
    String[] strs = str.split("-");
    return Integer.valueOf(strs[num].trim());
  }

  public static void calendar(int status){
    Calendar cal = Calendar.getInstance();
    String period="";
    int fromYear=cal.get(Calendar.YEAR)-1;
    int toYear=cal.get(Calendar.YEAR);
    int month=cal.get(Calendar.MONTH)+1;
    switch (month){
      case 2:;
      case 3:;
      case 4:;
      case 5:;
      case 6:
        period="第二学期";
        break;
      case 8:;
      case 9:;
      case 10:;
      case 11:;
      case 12:;
      case 1:
        period="第一学期";
        break;
    }
    System.out.println(fromYear+"-"+toYear+period+(status==0?"期末考试":"模拟考试"));
  }

}